package com.wongoing.api.pay.action;

import java.io.BufferedReader;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
import com.wongoing.api.pay.manager.PayManager;
import com.wongoing.api.pay.service.OrderUnifiedEntranceService;
import com.wongoing.apiclient.alipay.AlipayHelper;
import com.wongoing.apiclient.alipay.query.Alipay;
import com.wongoing.apiclient.weixin.WXPayConfigImpl;
import com.wongoing.apiclient.weixin.WXPayHelper;
import com.wongoing.apiclient.weixin.WXPayUtil;
import com.wongoing.apiclient.weixin.WXPayConstants.SignType;
import com.wongoing.base.Json;
import com.wongoing.base.PageResult;
import com.wongoing.bus.util.Constants;
import com.wongoing.jwt.JwtUserModel;
import com.wongoing.util.DateConvert;
import com.wongoing.util.DateStyle;
import com.wongoing.util.IpUtil;
import com.wongoing.util.LogService;
import com.wongoing.util.ModelAndViewConstants;
import com.wongoing.util.PageUtil;
import com.wongoing.util.QRCodeUtil;
import com.wongoing.util.ResourceUtil;

@Controller
@RequestMapping("/pay")
public class PayAction {
	
	@Autowired
	private OrderUnifiedEntranceService serivce;
	
	/*-----------------------------test area start-----------------------------------*/
	@ResponseBody
	@RequestMapping("/open/wxPayTest")
	public Json<Map<String, String>> wxPayTest(String openid, String outTradeNo, String totalFee, String body, String productId, String ip) {
		try {
			Map<String, String> data = PayManager.getInstance().wxPublicAccountPay(openid, outTradeNo, totalFee, body, productId, ip);
			return new Json<Map<String, String>>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信支付通知异常：" + e.getMessage());
			return new Json<Map<String, String>>().fail();
		}
	}
	
	@ResponseBody
	@RequestMapping("/open/wxH5PayTest")
	public Json<String> wxH5PayTest(String outTradeNo, String totalFee, String body,String productId, String ip) {
		try {
			String data = PayManager.getInstance().wxH5Pay(outTradeNo, totalFee, body, productId, ip);
			return new Json<String>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信支付通知异常：" + e.getMessage());
			return new Json<String>().fail();
		}
	}
	
	@ResponseBody
	@RequestMapping("/open/alipayH5PayTest")
	public Json<String> alipayH5PayTest(String outTradeNo, String totalFee, String subject,String body) {
		try {
			String data = PayManager.getInstance().aplipayH5Pay(outTradeNo, totalFee, subject, body);
			return new Json<String>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信支付通知异常：" + e.getMessage());
			return new Json<String>().fail();
		}
	}
	
	@ResponseBody
	@RequestMapping("/open/alipayTransferTest")
	public Json<AlipayFundTransToaccountTransferResponse> alipayTransfer(String outBizNo, String payeeAccount, String amount, String payeeRealName, String remark) {
		try {
			AlipayFundTransToaccountTransferResponse data = PayManager.getInstance().alipayTransfer(outBizNo, payeeAccount, amount, payeeRealName, remark);
			return new Json<AlipayFundTransToaccountTransferResponse>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信支付通知异常：" + e.getMessage());
			return new Json<AlipayFundTransToaccountTransferResponse>().fail();
		}
	}
	
	
	@ResponseBody
	@RequestMapping("/open/wxWebScanQRCodeTest")
	public Json<String> wxWebScanQRCodeTest(String outTradeNo, String totalFee, String body, String productId, String ip) {
		try {
			String returnUrl = "";
			String data = PayManager.getInstance().wxWebScanQRCode(outTradeNo, totalFee, body, productId, ip, returnUrl);
			return new Json<String>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信网页扫码支付通知异常：" + e.getMessage());
			return new Json<String>().fail();
		}
	}
	
	
	@ResponseBody
	@RequestMapping("/open/alipayWebScanQrCodePayTest")
	public Json<String> alipayWebScanQrCodePayTest(String WIDout_trade_no, String WIDtotal_amount, String WIDsubject, String WIDbody,
			  String resturnUrl, String ip) {
		try {
			String data = PayManager.getInstance().alipayWebScanQrCodePay(WIDout_trade_no, WIDtotal_amount, WIDsubject, WIDbody, resturnUrl, ip);
			return new Json<String>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信网页扫码支付通知异常：" + e.getMessage());
			return new Json<String>().fail();
		}
	}
	
	@ResponseBody
	@RequestMapping("/open/wxPayQueryTest")
	public Json<Map<String,String>> wxPayQueryTest(String outTradeNo) {
		try {
			Map<String,String> data = PayManager.getInstance().wxPayQuery(outTradeNo);
			return new Json<Map<String,String>>().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信网页查新订单通知异常：" + e.getMessage());
			return new Json<Map<String,String>>().fail();
		}
	}
	
	@ResponseBody
	@RequestMapping("/open/wxPayTransferTest")
	public Json wxPayTransferTest() {
		try {
			String partner_trade_no = "TT20180627105601";
			String enc_bank_no = "建设银行";
			String enc_true_name = "吴兆强";
			String bank_code = "1003";
			String amount = "100";
			Map<String,String> result = WXPayHelper.getInstance().weixinTransferResult(partner_trade_no, enc_bank_no, enc_true_name, bank_code, amount, null);
			String return_code = result.get("return_code");
			String result_code = result.get("result_code");
			String err_code = result.get("err_code");
			String payment_no = result.get("payment_no");
			String cmms_amt = result.get("cmms_amt");
			LogService.getInstance(this).info("return_code:"+return_code);
			LogService.getInstance(this).info("result_code:"+result_code);
			LogService.getInstance(this).info("err_code:"+err_code);
			LogService.getInstance(this).info("payment_no:"+payment_no);
			LogService.getInstance(this).info("cmms_amt:"+cmms_amt);
			return new Json().success(result);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信支付通知异常：" + e.getMessage());
			return new Json().fail();
		}
	}
	
	/*-----------------------------test area end-----------------------------------*/
	
	
	/**
	 * 功能说明：微信支付扫码回调地址
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月15日 下午1:45:22
	 * @param request
	 * @param response
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/open/wechat")
	public String WXPayOk(HttpServletRequest request, HttpServletResponse response) {
		try {
			BufferedReader reader = null;
			reader = request.getReader();
			String line = "";
			String xmlString = null;
			StringBuffer inputString = new StringBuffer();
			while ((line = reader.readLine()) != null) {
				inputString.append(line);
			}
			xmlString = inputString.toString();
			Map<String, String> result = WXPayUtil.xmlToMap(xmlString);
			// 通信标识。
			if ("FAIL".equals(result.get("return_code")))
				return WXPayHelper.getInstance().wxPayFailToXml(null);
			// 数据返回结果校验，success则表示数据返回成功，否则标识为通信成功但数据返回失败。
			if ("FAIL".equals(result.get("result_code")))
				return WXPayHelper.getInstance().wxPayFailToXml(null);
			String orderNum = result.get("out_trade_no");
			String gmtPayment = result.get("time_end");
			String totalFee = result.get("total_fee");
			String tradeNo = result.get("transaction_id");
			String buyerEmail = result.get("openid");
			String payWay = Constants.PAY_WAY_WEIXIN;
			if(StringUtils.isBlank(orderNum) 
					|| StringUtils.isBlank(gmtPayment) 
					|| StringUtils.isBlank(totalFee)
					|| StringUtils.isBlank(tradeNo)) 
				return WXPayHelper.getInstance().wxPayFailToXml(null);
			// 校验是否已处理过订单数据，如果未处理则进入下一步进行数据处理，否则直接返回成功。
			// 数据为处理时，进行最终的数据处理（注：此处修改订单表状态将待支付改为已支付状态）
			// 更新订单主表信息
			String resultStr = this.serivce.OrderUnifiedEntrance(payWay, orderNum, gmtPayment, totalFee, tradeNo, buyerEmail);
			return "success".equals(resultStr)?WXPayHelper.getInstance().wxPaySuccessToXml():WXPayHelper.getInstance().wxPayFailToXml(null);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信支付通知异常：" + e.getMessage());
			return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>";
		}
	}
	
	/**
	 * 
	 * 功能说明：App调用支付宝支付宝异步通知地址 (不需要验签)
	 * 修改说明：   
	 * @author 袁海涛
	 * @date 2018年4月9日 上午10:13:53
	 * @param request
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/open/alipayApp")
	public String alipayApp(HttpServletRequest request) {
		try {
			
			String orderNum = request.getParameter("out_trade_no");
			String gmtPayment = request.getParameter("gmt_payment");
			String totalFee = request.getParameter("total_amount");
			String tradeNo = request.getParameter("trade_no");
			String buyerEmail = request.getParameter("buyer_logon_id");
			String payWay = Constants.PAY_WAY_ALIPAY;
			if(StringUtils.isBlank(orderNum) 
					|| StringUtils.isBlank(gmtPayment) 
					|| StringUtils.isBlank(totalFee)
					|| StringUtils.isBlank(tradeNo)) 
				return "fail";
			return this.serivce.OrderUnifiedEntrance(payWay, orderNum, gmtPayment, totalFee, tradeNo, buyerEmail);
		} catch (Exception e) {
			LogService.getInstance(this).error("支付宝支付失败：" + e.getMessage(), e);
			return "fail";
		}
	}
	
	/**
	 * 功能说明：web扫码回调异步通知地址
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 上午11:29:40
	 * @param request
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/open/alipay")
	public String alipay(HttpServletRequest request) {
		try {
			boolean flag = AlipayHelper.payResultInfo(request.getParameterMap());
			if(!flag) return "fail"; 
			String orderNum = request.getParameter("out_trade_no");
			String gmtPayment = request.getParameter("gmt_payment");
			String totalFee = request.getParameter("total_fee");
			String tradeNo = request.getParameter("trade_no");
			String buyerEmail = request.getParameter("buyer_email");
			String payWay = Constants.PAY_WAY_ALIPAY;
			if(StringUtils.isBlank(orderNum) 
					|| StringUtils.isBlank(gmtPayment) 
					|| StringUtils.isBlank(totalFee)
					|| StringUtils.isBlank(tradeNo)) 
				return "fail";
			return this.serivce.OrderUnifiedEntrance(payWay, orderNum, gmtPayment, totalFee, tradeNo, buyerEmail);
		} catch (Exception e) {
			LogService.getInstance(this).error("支付宝支付失败：" + e.getMessage(), e);
			return "fail";
		}
	}
	
	/**
	 * 功能说明：跳转微信扫码页
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 下午9:02:31
	 * @param qrcodeUrl
	 * @return
	 */
	@RequestMapping("/open/wxScanQRCodePage")
	public ModelAndView wxScanQRCodePage(String qrcodeUrl, String qrcodeImgName, String outTradeNo, String totalFee, String body, String productId, String ip, String returnUrl) {
		ModelAndView mv = new ModelAndView(); 
		mv.addObject("qrcodeUrl", qrcodeUrl);
		mv.addObject("qrcodeImgName", qrcodeImgName);
		mv.addObject("outTradeNo", outTradeNo);
		mv.addObject("totalFee", totalFee);
		mv.addObject("body", body);
		mv.addObject("productId", productId);
		mv.addObject("ip", ip);
		mv.addObject("returnUrl",returnUrl);
		mv.setViewName("pay/wechat/toWXPay");
		return mv;
	}
	
	/**
	 * 功能说明：扫码成功跳转倒计时页面
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 下午9:22:44
	 * @param qrcodeUrl
	 * @return
	 */
	@RequestMapping("/open/wxScanQRCodeSuccessPage")
	public ModelAndView wxScanQRCodeSuccessPage(String outTradeNo, String returnUrl) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("outTradeNo", outTradeNo);
		mv.addObject("returnUrl", returnUrl);
		mv.setViewName("pay/wechat/wxPayOk");
		return mv;
	}
	
	/**
	 * 功能说明：微信支付是否成功判断函数
	 * 修改说明：采用查新微信订单接口的方式查询是否支付成功，如需实现自己的个性化设置吗，请才此处添加
	 * @author 吴兆强
	 * @date 2018年6月29日 上午10:00:54
	 * @param request
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/open/wxPayIsSucceed")
	public Json<String> wxPayIsSucceed(String outTradeNo) {
		try {
			if(StringUtils.isBlank(outTradeNo)) 
				return new Json<String>().fail();
			Map<String,String> result = PayManager.getInstance().wxPayQuery(outTradeNo);
			if(!"SUCCESS".equals(result.get("return_code")) || !"SUCCESS".equals(result.get("result_code"))) 
				return new Json<String>().fail();
			if(!"SUCCESS".equals(result.get("trade_state")))
				return new Json<String>().fail();
			return new Json<String>().success(result.get("out_trade_no"));
		} catch (Exception e) {
			LogService.getInstance(this).error("微信支付是否成功判断函数异常：" + e.getMessage(), e);
			return new Json<String>().fail();
		}
	}
	
	/**
	 * 功能说明：微信支付刷新二维码
	 * 修改说明：需要在登录时完成操作
	 * @author 吴兆强
	 * @date 2018年6月29日 上午10:27:25
	 * @param outTradeNo
	 * @param totalFee
	 * @param body
	 * @param productId
	 * @param ip
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/open/wxPayToRefreshQRCode")
	public Json<String> wxPayRefreshQRCode(String qrocodeImName, String outTradeNo, String totalFee, String body, String productId, String ip) {
		try {
			String qrcodeUrl = Constants.ERROR;
			Map<String, String> data = WXPayHelper.getInstance().weixinPayResult(outTradeNo, totalFee, body, productId, ip);
			String returnCode = data.get("return_code");
			String resultCode = data.get("result_code");
			if("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode)) 
				qrcodeUrl = QRCodeUtil.encodeFixedPath(data.get("code_url"), qrocodeImName);
			qrcodeUrl = qrcodeUrl.replace("\\", "/");
			return new Json<String>().success(qrcodeUrl);
		} catch (Exception e) {
			LogService.getInstance(this).error("微信支付是否成功判断函数异常：" + e.getMessage(), e);
			return new Json<String>().fail();
		}
	}
	
	/**
	 * 功能说明：APP业务调起支付统一入口，目前支持支付宝、微信两种方式
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月3日 下午9:26:41
	 * @param request
	 * @param payType
	 * @param outTradeNo
	 * @param totalFee
	 * @param subject
	 * @param productId
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@ResponseBody
	@RequestMapping("/payUnifiedEntrance")
	public Json<String> payUnifiedEntrance(HttpServletRequest request, String payType, String outTradeNo, String totalFee, String subject,String productId) {
		String data = null;
		
		try {
			if(StringUtils.isBlank(payType))
				return new Json<String>().fail("支付方式不能为空！");
			if(StringUtils.isBlank(outTradeNo))
				return new Json<String>().fail("订单号不能为空！");
			if(StringUtils.isBlank(totalFee))
				return new Json<String>().fail("支付金额不能为空！");
			if(StringUtils.isBlank(subject))
				return new Json<String>().fail("订单名称不能为空！");
			if(StringUtils.isBlank(productId))
				return new Json<String>().fail("商品ID不能为空！");
			//1.查询微信接口,查看该订单是否已在微信支付，微信存在两种返回，
			Map<String,String>  wxpayResult = PayManager.getInstance().wxPayQuery(outTradeNo);
			//1.1 通讯状态判断
			if("FAIL".equals(wxpayResult.get("return_code"))) 
				return new Json().fail(wxpayResult.get("return_msg"));
			//1.1.1失败业务判断：系统错误返回，此交易订单号存在则可正常通过验证
			if("FAIL".equals(wxpayResult.get("result_code"))) {
				if("SYSTEMERROR".equals(wxpayResult.get("err_code")))
					return new Json().fail(wxpayResult.get("err_code_des"));
			} else {
			//1.1.2成功业务判断
				if("REFUND".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已转入退款");
				if("SUCCESS".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已支付成功");
				if("CLOSED".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已关闭");
				if("REVOKED".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已撤销（刷卡支付）");
				if("USERPAYING".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("支付中（微信支付）");
				if("PAYERROR".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("支付失败（微信支付）");
			}
			//2支付宝查询订单是否已支付
			Alipay alipayResult =  PayManager.getInstance().alipayQueryToBean(null, outTradeNo);
			//2.1 T状态为数据返回成功状态，标识业务正在处理或处理完成，先关参数见文档
			if("T".equals(alipayResult.getIsSuccess())) 
				return new Json<String>().fail("该订单已发生过交易");
			//2.1 除订单不存在异常为订单未支付状态（业务所需），其余为支付异常状态
			if(!"TRADE_NOT_EXIST".equals(alipayResult.getError())) 
				return new Json<String>().fail("订单支付参数存在错误或交易环境异常");
			//1.查询微信接口,查看该订单是否已在微信支付
//			Map<String,String>  wxpayResult = PayManager.getInstance().wxPayQuery(outTradeNo);
//			System.out.println("-------------------------------------------");
//			for(Map.Entry<String, String> entry:wxpayResult.entrySet()){
//	            System.out.println(entry.getKey()+"/"+entry.getValue());
//	        }
//			if(wxpayResult==null)
//				return new Json<String>().fail("支付环境监测异常，请重新尝试或联系管理员！");
//			//1.1 通讯状态判断
//			if("FAIL".equals(wxpayResult.get("return_code"))) 
//				return new Json<String>().fail(wxpayResult.get("return_msg"));
//			//1.2 业务状态判断
//			if("SUCCESS".equals(wxpayResult.get("result_code"))) 
//				return new Json<String>().fail(wxpayResult.get("err_code_dJes"));
//			//1.3 交易状态判断
//			if("SYSTEMERROR".equals(wxpayResult.get("err_code"))) 
//				return new Json<String>().fail("微信系统错误！");
			
			//1.2 业务状态判断
//			if("FAIL".equals(wxpayResult.get("result_code"))) 
//				return new Json<String>().fail(wxpayResult.get("err_code_des"));
//			//1.3 交易状态判断
//			if("REFUND".equals(wxpayResult.get("trade_state"))) 
//				return new Json<String>().fail("该订单转入退款");
//			if("SUCCESS".equals(wxpayResult.get("trade_state"))) 
//				return new Json<String>().fail("该订单已支付成功");
//			if("CLOSED".equals(wxpayResult.get("trade_state"))) 
//				return new Json<String>().fail("该订单已关闭");
//			if("REVOKED".equals(wxpayResult.get("trade_state"))) 
//				return new Json<String>().fail("该订单已撤销（刷卡支付）");
//			if("USERPAYING".equals(wxpayResult.get("trade_state"))) 
//				return new Json<String>().fail("支付中");
//			if("PAYERROR".equals(wxpayResult.get("trade_state"))) 
//				return new Json<String>().fail("支付失败");
//			//2.查询微信接口,查看该订单是否已在微信支付
//			Alipay alipayResult =  PayManager.getInstance().alipayQueryToBean(null, outTradeNo);
//			System.out.println("-------------------------------------------");
//			System.out.println(alipayResult.getIsSuccess());
//			System.out.println("------------------------1111-------------------");
//			//2.1 T状态为数据返回成功状态，标识业务正在处理或处理完成，先关参数见文档
//			if("T".equals(alipayResult.getIsSuccess())) 
//				return new Json<String>().fail("该订单已发生过交易");
//			//2.1 除订单不存在异常为订单未支付状态（业务所需），其余为支付异常状态
//			if(!"TRADE_NOT_EXIST".equals(alipayResult.getError())) 
//				return new Json<String>().fail("订单支付参数存在错误或交易环境异常");
			//3. 具体业务
			//3.1判断支付方式：alipay支付宝
			if(Constants.PAY_WAY_ALIPAY.equals(payType)) {
				data = PayManager.getInstance().aplipayH5Pay(outTradeNo, totalFee, subject, "APP支付");
				return new Json<String>().success(data);
			}
			//3.2判断支付方式： weixin微信
			if(Constants.PAY_WAY_WEIXIN.equals(payType)) {
				//微信金额以分为单位，将string 转为分的int类型
				if(totalFee!=null) {
					BigDecimal tf=new BigDecimal(totalFee); 
					//设置小数位数，第一个变量是小数位数，第二个变量是取舍方法(四舍五入) 
					tf=tf.setScale(2, BigDecimal.ROUND_HALF_UP);
					BigDecimal bd= new BigDecimal("100");
					tf=tf.multiply(bd);
					int result=tf.intValue(); 
					totalFee=Integer.toString(result);
				}
				String ip = IpUtil.getIp(request);
				data = PayManager.getInstance().wxH5Pay(outTradeNo, totalFee, subject, productId, ip);
				return new Json<String>().success(data);
			}
			return new Json<String>().fail("不支持的支付方式");
		} catch (Exception e) {
			LogService.getInstance(this).debug("APP业务调起支付统一入口：" + e.getMessage());
			return new Json<String>().fail();
		}
	}
	
	/**
	 * 功能说明：微信公众号支付统一接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月4日 下午4:45:58
	 * @param openid 商户下用户唯一标识
	 * @param outTradeNo 商户订单号
	 * @param totalFee 支付金额
	 * @param body 标题
	 * @param productId 产品ID
	 * @param ip 
	 * @return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@ResponseBody
	@RequestMapping("/wxPublicAccountPay")
	public Json wxPublicAccountPay(HttpServletRequest request, String openid, String outTradeNo, String totalFee, String body, String productId) {
		try {
			//1.查询微信接口,查看该订单是否已在微信支付，微信存在两种返回，
			Map<String,String>  wxpayResult = PayManager.getInstance().wxPayQuery(outTradeNo);
			//1.1 通讯状态判断
			if("FAIL".equals(wxpayResult.get("return_code"))) 
				return new Json().fail(wxpayResult.get("return_msg"));
			//1.1.1失败业务判断：系统错误返回，此交易订单号存在则可正常通过验证
			if("FAIL".equals(wxpayResult.get("result_code"))) {
				if("SYSTEMERROR".equals(wxpayResult.get("err_code")))
					return new Json().fail(wxpayResult.get("err_code_des"));
			} else {
				if("REFUND".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已转入退款");
				if("SUCCESS".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已支付成功");
				if("CLOSED".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已关闭");
				if("REVOKED".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("该订单已撤销（刷卡支付）");
				if("USERPAYING".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("支付中（微信支付）");
				if("PAYERROR".equals(wxpayResult.get("trade_state"))) 
					return new Json<String>().fail("支付失败（微信支付）");
			}
			//微信金额以分为单位，将string 转为分的int类型
			if(totalFee!=null) {
				BigDecimal tf=new BigDecimal(totalFee); 
				//设置小数位数，第一个变量是小数位数，第二个变量是取舍方法(四舍五入) 
				tf=tf.setScale(2, BigDecimal.ROUND_HALF_UP);
				BigDecimal bd= new BigDecimal("100");
				tf=tf.multiply(bd);
				int result=tf.intValue(); 
				totalFee=Integer.toString(result);
			}
			String ip = IpUtil.getIp(request);
			Map<String, String> data = PayManager.getInstance().wxPublicAccountPay(openid, outTradeNo, totalFee, body, productId, ip);
			return new Json().success(data);
		} catch (Exception e) {
			LogService.getInstance(this).debug("微信公众号支付统一接口：" + e.getMessage());
			return new Json().fail();
		}
	}
	
}
